#!/bin/bash
# 调整严格模式：允许read在文件末尾正常退出（避免提前终止）
set -uo pipefail

# 配置
OUTPUT_FILE="merged_tracks.txt"
CHILLHOP_FILE="chillhop.txt"
ARCHIVE_FILE="archive.txt"

# 清空输出文件
> "$OUTPUT_FILE"

# -------------------------- 工具函数：处理文件格式和Trim --------------------------
# 1. 转换Windows换行符（CRLF → LF）+ 移除UTF-8 BOM（避免乱码）
fix_file_format() {
    local input="$1"
    local output="${input}.tmp"
    # 用sed转换换行符+去BOM（无需安装额外工具，系统自带）
    sed -e 's/\r$//' -e '1s/^\xEF\xBB\xBF//' "$input" > "$output"
    mv "$output" "$input"
    echo "✅ 已修复 $input 的格式（CRLF→LF + 去BOM）"
}

# 2. Trim字符串（替代xargs，避免截断）
trim() {
    local str="$1"
    # 移除首尾空格/制表符/换行符
    echo "$str" | sed -e 's/^[[:space:]]*//' -e 's/[[:space:]]*$//'
}

# -------------------------- 解析 chillhop.txt（支持大文件） --------------------------
parse_chillhop() {
    echo -e "\n=== 开始解析 $CHILLHOP_FILE（大文件优化）==="
    local base_url line_num valid_count skip_count
    line_num=1
    valid_count=0
    skip_count=0

    # 用「进程替换」替代管道（避免子shell隔离，支持大文件遍历）
    while IFS= read -r line; do
        # 第一行：读取基础URL
        if [[ $line_num -eq 1 ]]; then
            base_url=$(trim "$line")
            # 检查基础URL有效性
            if [[ -z "$base_url" || ! "$base_url" =~ ^https?:// ]]; then
                echo "❌ 错误：$CHILLHOP_FILE 第1行不是有效URL（需以http/https开头）"
                return 1
            fi
            # 补全URL末尾的 "/"
            [[ "${base_url: -1}" != "/" ]] && base_url="${base_url}/"
            echo "📌 基础URL：$base_url"
            ((line_num++))
            continue
        fi

        # 处理后续行（曲目行）
        local trimmed_line=$(trim "$line")
        # 跳过空行
        if [[ -z "$trimmed_line" ]]; then
            ((skip_count++))
            ((line_num++))
            continue
        fi

        # 检查格式（必须包含 "!"）
        if [[ "$trimmed_line" != *"!"* ]]; then
            echo "⚠️  跳过第$line_num行：格式错误（无 '!'，需为 'ID!名称'）"
            ((skip_count++))
            ((line_num++))
            continue
        fi

        # 分割 ID 和 名称（支持名称含特殊字符）
        local id="${trimmed_line%%!*}"  # "!" 左边是ID
        local name="${trimmed_line#*!}" # "!" 右边是名称
        id=$(trim "$id")
        name=$(trim "$name")

        # 检查ID/名称非空
        if [[ -z "$id" || -z "$name" ]]; then
            echo "⚠️  跳过第$line_num行：ID或名称为空"
            ((skip_count++))
            ((line_num++))
            continue
        fi

        # 生成完整URL（加 get.2sb.org 前缀）
        local full_url="https://get.2sb.org/${base_url}${id}"
        # 写入输出文件（用printf避免换行符问题）
        printf "%s!%s\n" "$name" "$full_url" >> "$OUTPUT_FILE"

        # 每解析100首打印一次进度（避免日志刷屏）
        if [[ $((valid_count % 100)) -eq 0 && $valid_count -ne 0 ]]; then
            echo "[v] 已解析 $valid_count 首..."
        fi
        ((valid_count++))
        ((line_num++))

    done < <(cat "$CHILLHOP_FILE") # 进程替换：< <(...) 替代管道

    # 打印解析结果
    echo -e "\n=== $CHILLHOP_FILE 解析完成 ==="
    echo "✅ 有效曲目：$valid_count 首"
    echo "❌ 跳过条目：$skip_count 条"
    echo "------------------------"
}

# -------------------------- 解析 archive.txt（同大文件优化） --------------------------
parse_archive() {
    echo -e "\n=== 开始解析 $ARCHIVE_FILE（大文件优化）==="
    local base_url line_num valid_count skip_count
    line_num=1
    valid_count=0
    skip_count=0

    while IFS= read -r line; do
        # 第一行：读取基础URL
        if [[ $line_num -eq 1 ]]; then
            base_url=$(trim "$line")
            if [[ -z "$base_url" || ! "$base_url" =~ ^https?:// ]]; then
                echo "❌ 错误：$ARCHIVE_FILE 第1行不是有效URL"
                return 1
            fi
            [[ "${base_url: -1}" != "/" ]] && base_url="${base_url}/"
            echo "📌 基础URL：$base_url"
            ((line_num++))
            continue
        fi

        # 处理后续行（相对路径）
        local trimmed_line=$(trim "$line")
        if [[ -z "$trimmed_line" ]]; then
            ((skip_count++))
            ((line_num++))
            continue
        fi

        # 生成完整URL
        local full_url="https://get.2sb.org/${base_url}${trimmed_line}"
        # URL解码提取名称（用Python，兼容特殊字符，避免截断）
        local name
        name=$(python3 -c "
import sys, urllib.parse
path = urllib.parse.unquote(sys.stdin.read().strip())
print(path.split('/')[-1] if '/' in path else path)
" <<< "$trimmed_line")

        if [[ -z "$name" ]]; then
            echo "⚠️  跳过第$line_num行：无法提取名称"
            ((skip_count++))
            ((line_num++))
            continue
        fi

        # 写入输出文件
        printf "%s!%s\n" "$name" "$full_url" >> "$OUTPUT_FILE"

        # 进度提示
        if [[ $((valid_count % 100)) -eq 0 && $valid_count -ne 0 ]]; then
            echo "🔄 已解析 $valid_count 首..."
        fi
        ((valid_count++))
        ((line_num++))

    done < <(cat "$ARCHIVE_FILE") # 进程替换：支持大文件

    echo -e "\n=== $ARCHIVE_FILE 解析完成 ==="
    echo "✅ 有效曲目：$valid_count 首"
    echo "❌ 跳过条目：$skip_count 条"
    echo "------------------------"
}

# -------------------------- 主逻辑 --------------------------
main() {
    # 1. 检查输入文件是否存在
    for file in "$CHILLHOP_FILE" "$ARCHIVE_FILE"; do
        if [[ ! -f "$file" ]]; then
            echo "❌ 错误：未找到 $file（需放在当前目录）"
            exit 1
        fi
    done

    # 2. 修复文件格式（避免Windows换行符/乱码问题）
    fix_file_format "$CHILLHOP_FILE"
    fix_file_format "$ARCHIVE_FILE"

    # 3. 解析两个文件
    parse_chillhop
    parse_archive

    # 4. 统计总条目
    local total_entries=$(wc -l < "$OUTPUT_FILE" | trim)
    echo -e "\n🎉 合并完成！"
    echo "📄 输出文件：$OUTPUT_FILE"
    echo "📊 总有效曲目：$total_entries 首（chillhop + archive）"
    echo "🔗 所有URL已添加前缀：https://get.2sb.org/"
    echo "📋 格式示例：Apple Juice!https://get.2sb.org/https://stream.chillhop.com/mp3/9476"
}

# 启动
main
